Development and management of complex software systems has relied on a variety of software techniques. These techniques include abstractions (such as modules, function, classes, and objects) that enable developers to divide software components into smaller and more manageable entities, reusability concepts (such as libraries, templates, inheritance, and generative abstractions) that allow developers to either use or extend an existing software artifact, and software engineering patterns (such as command, Model View Controller, Proxy, etc.) that capture software solutions to commonly occurring problems.
Programming languages and tools have been developed that directly or indirectly provide mechanisms to support the above described software techniques. For instance, object-oriented programming languages such as Java™ provide direct support for functions, classes, inheritance, and modules, etc., to help software developers build software easily and efficiently.
As software systems become more complex and model real world entities, real world relationships, and real world behaviors, software applications need the ability to model states and behaviors that are dependent not only on individual entities, but also on the relationships within which these entities occur.
Embodiments described herein present methods for enabling software applications and systems to model, identify, specify, and implement software entities whose states and specific behavior depend on relationships with other software entities.